<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>

</body>
<script>
    //【1】Math.max([value1[, value2, ...]])
    // 值得注意的是：
    // 1,如果有任一参数不能被转换为数值，则结果为 NaN。
    // 2,max 是 Math 的静态方法，所以应该像这样使用：Math.max()，而不是作为 Math 实例的方法 (简单的来说，就是不使用 new )
    // 3,如果没有参数，则结果为 -Infinity (注意是负无穷大)
    console.log(Math.max(0, 1, 2, 5, 4)); // 5
    // 1.如果任一参数不能被转换为数值，这就意味着如果参数可以被转换成数字，就是可以进行比较的，比如：

    Math.max(true, 0) // 1
    Math.max(true, '2', null) // 2
    Math.max(1, undefined) // NaN
    Math.max(1, {}); // NaN
    // 2.Math.max函数如果没有参数，则结果为 -Infinity，对应的，Math.min 函数，如果没有参数，则结果为 Infinity，所以：

    var min = Math.min(); //正无穷
    var max = Math.max(); //负无穷
    console.log(min > max);
    //【2】原始方法for循环
    // 最最原始的方法，莫过于循环遍历一遍：
    var arr = [6, 4, 1, 8, 2, 11, 23];
    var result = arr[0];
    for (var i = 1; i < arr.length; i++) {
        result = Math.max(result, arr[i]);
    }
    console.log(result);
    //【3】reduce
    // 既然是通过遍历数组求出一个最终值，那么我们就可以使用 reduce 方法：
    var arr = [6, 4, 1, 8, 2, 11, 23];

    function max1(prev, next) {
        return Math.max(prev, next);
    }
    console.log(arr.reduce(max1));
    //【4】排序
    // 如果我们先对数组进行一次排序，那么最大值就是最后一个值：
    var arr = [6, 4, 1, 8, 2, 11, 23];
    arr.sort(function(a, b) {
        return a - b;
    });
    console.log(arr[arr.length - 1]);
    //【5】数组为参数：eval,数组作为参数进行筛选
    // Math.max 支持传多个参数来进行比较，那么我们如何将一个数组转换成参数传进 Math.max 函数呢？eval 便是一种
    var arr = [6, 4, 1, 8, 2, 11, 23];
    var max = eval("Math.max(" + arr + ")");
    console.log(max);
    //【6】数组为参数：apply,使用apply将数组作为参数进行筛选
    var arr = [6, 4, 1, 8, 2, 11, 23];
    console.log(Math.max.apply(null, arr));
    //【7】数组为参数：使用es6语法的扩展福也能将数组作为参数，ES6...
    // 使用 ES6 的扩展运算符：
    var arr = [6, 4, 1, 8, 2, 11, 23];
    console.log(Math.max(...arr));
</script>

</html>